#ifndef COREXI_COMMON_PC_DESENCRYPT_P_H
#define COREXI_COMMON_PC_DESENCRYPT_P_H
#include <common/desencrypt/desencrypt.h>
#include <vector>

class DESEncryptPrivate
{
public:
	/**
	 * @brief 加密
	 * @param plaintext 原始串
	 * @return
	 */
	static std::string encrypt(const std::string& plaintext);

	/**
	 * @brief 解密
	 * @param ciphertext 加密串
	 * @return
	 */
	static std::string decrypt(const std::string& ciphertext);

	/**
	 * @brief 加密
	 * @param plaintext 原始串
	 * @param keyString 密钥
	 * @return
	 */
	static std::string encrypt(const std::string& plaintext, const std::string& keyString);

	/**
	 * @brief 解密
	 * @param ciphertext 加密串
	 * @param keyString 密钥
	 * @return
	 */
	static std::string decrypt(const std::string& ciphertext, const std::string& keyString);

	/**
	 * @brief base64加密
	 * @param text 原始串
	 * @return
	 */
	static std::string base64Encrypt(const std::string& plaintext);

private:
	static std::string bytesToHex(const std::vector<uint8_t>& data);
	static std::vector<uint8_t> hexToBytes(const std::string& hex);
	static std::vector<uint8_t> createKey(const std::string& keyString);
	static std::vector<uint8_t> createIV(const std::string& ivString);

	static std::vector<uint8_t> encryptDES_CBC(const std::vector<uint8_t>& plainBytes,
											   const std::vector<uint8_t>& key,
											   const std::vector<uint8_t>& iv);

	static std::vector<uint8_t> decryptDES_CBC(const std::vector<uint8_t>& cipherBytes,
											   const std::vector<uint8_t>& key,
											   const std::vector<uint8_t>& iv);
};


#endif//COREXI_COMMON_PC_DESENCRYPT_P_H
